﻿using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using JsonTemplateUtils;

namespace JsonTemplateUtils
{
    public static class JsonTemplateUtils
    {
        /// <summary>
        /// 获取JSON模板（已去除空白字符）
        /// </summary>
        public static string GetJson(string filePath)
        {
            // 读取文件内容（UTF-8编码）
            string jsonStr = File.ReadAllText(filePath, Encoding.UTF8);
            // 使用正则表达式移除所有空白字符（包括换行、制表符等）
            return Regex.Replace(jsonStr, @"\s*|\r|\n|\t", "");
        }

        /// <summary>
        /// 通过字符串替换拼装模板（处理对象/数组和普通值类型）
        /// </summary>
        public static string AssemblingByReplace(string jsonTemplate, object param)
        {
            // 将参数对象序列化为JSON字符串
            string paramStr = JObject.FromObject(param).ToString();
            // 解析为JObject以便遍历键值对
            JObject paramsObj = JObject.Parse(paramStr);

            foreach (var kvp in paramsObj)
            {
                string key = kvp.Key;
                JToken value = kvp.Value;

                // 构造两种可能的占位符格式（带引号和不带引号）
                string replaceSymbol1 = $"\"${{{key}}}\"";  // 处理类似"${Key}"的占位符
                string replaceSymbol2 = $"${{{key}}}";      // 处理类似${Key}的占位符

                // 根据值类型执行不同的替换逻辑
                if (value.Type == JTokenType.Object || value.Type == JTokenType.Array)
                {
                    // 处理对象或数组类型，直接插入JSON内容（无格式化）
                    jsonTemplate = jsonTemplate.Replace(replaceSymbol1, value.ToString(Newtonsoft.Json.Formatting.None));
                }
                else if (value.Type == JTokenType.String)
                {
                    // 处理字符串类型，直接替换不带引号的占位符
                    jsonTemplate = jsonTemplate.Replace(replaceSymbol2, value.ToString());
                }
                else
                {
                    // 处理其他基本类型（数字、布尔值等），替换带引号的占位符
                    jsonTemplate = jsonTemplate.Replace(replaceSymbol1, value.ToString());
                }
            }
            return jsonTemplate;
        }

        /// <summary>
        /// 通过数组分割拼装模板（更安全处理嵌套结构）
        /// </summary>
        public static string AssemblingByArray(string jsonTemplate, object param)
        {
            // 将参数对象序列化为JObject
            string paramStr = JObject.FromObject(param).ToString();
            JObject paramsObj = JObject.Parse(paramStr);

            // 使用StringBuilder提高字符串操作性能
            StringBuilder ret = new StringBuilder();
            // 按"${分割字符串，保留分割结果
            string[] split = Regex.Split(jsonTemplate, "\"\\$\\{");

            for (int i = 0; i < split.Length; i++)
            {
                if (i == 0)
                {
                    // 处理第一个分割段（无占位符前缀）
                    ret.Append(split[i]);
                }
                else
                {
                    string segment = split[i];
                    // 查找占位符结束位置
                    int endIndex = segment.IndexOf("}\"");
                    if (endIndex == -1)
                    {
                        // 未找到闭合符号，原样拼接
                        ret.Append("\"${").Append(segment);
                        continue;
                    }

                    // 提取占位符中的Key
                    string key = segment.Substring(0, endIndex);
                    // 获取占位符后的剩余内容
                    string remaining = segment.Substring(endIndex + 2);

                    // 查找参数值
                    if (!paramsObj.TryGetValue(key, out JToken value))
                    {
                        // 未找到参数时插入空字符串
                        ret.Append("\"\"");
                    }
                    else
                    {
                        // 根据值类型处理
                        if (value.Type == JTokenType.Object || value.Type == JTokenType.Array)
                        {
                            // 插入JSON对象/数组（无格式化）
                            ret.Append(value.ToString(Newtonsoft.Json.Formatting.None));
                        }
                        else if (value.Type == JTokenType.String)
                        {
                            // 为字符串值添加引号
                            ret.Append('"').Append(value).Append('"');
                        }
                        else
                        {
                            // 直接插入基本类型值
                            ret.Append(value);
                        }
                    }
                    // 拼接剩余内容
                    ret.Append(remaining);
                }
            }
            return ret.ToString();
        }
    }
}